package com.mef.smsplat.util;


import java.util.HashMap;
import java.util.Map;

import com.mef.smsplat.sms.MsgSend;
import com.mef.smsplat.sms.SmsBean;

/**
 * 发送短信工具类
 * @author hc24
 *
 */
public class SmsUtil {
	private static int i=1;
	/** 短信发送线程 */
	private static MsgSend msgSend = new MsgSend();
	/** 缓存  短信发送序号-短信发送历史ID,缓存大小1000，不可能1000个同时在发送 */
	public static Map<Integer, String> seqHistoryId=new HashMap<Integer, String>(1000);
	
	static{
		msgSend.start();//启动短信发送的线程
	}
	
	private synchronized static int nextSeq(){
		if(i>1000)
			i=1;
		return i++;
	}
	
	/**
	 * 短信发送方法，单发
	 * @param phone 发送的电话号码
	 * @param content 短信内容
	 * @param smsHistoryId 短信发送历史ID，用户更新数据库使用
	 */
	public static void sendSms(String phone,String content,String smsHistoryId){
		SmsBean smsBean=new SmsBean();
		smsBean.setContent(content);
		smsBean.setPhones(new String[]{phone});
		smsBean.setSmsHistoryId(smsHistoryId);
		smsBean.setSequence(nextSeq());
		
		seqHistoryId.put(smsBean.getSequence(), smsHistoryId);//把序列号和数据库中id对应
						
		msgSend.sendQueue.push(smsBean);//交给另外的线程去做吧
	}
	
	/**
	 * 短信群发功能，这里的群发是假的群发，实际上还是调用短信接口一条条去发送的<br/>
	 * 因为真正的群发短信接口是不支持状态回执的
	 * @param phones 电话号码数组
	 * @param content 短信内容
	 * @param smsHistoryIds 短信发送历史ID数组，用户更新数据库使用 
	 */
	public static void sendSms(String[] phones,String content,String[] smsHistoryIds){
		
		if(phones.length!=smsHistoryIds.length)
			throw new RuntimeException("参数phones和smsHistoryIds个数不一致");
		
		for(int i=0;i<phones.length;i++){
			SmsBean smsBean=new SmsBean();
			smsBean.setContent(content);
			smsBean.setPhones(new String[]{phones[i]});
			smsBean.setSmsHistoryId(smsHistoryIds[i]);
			smsBean.setSequence(nextSeq());
			
			seqHistoryId.put(smsBean.getSequence(), smsHistoryIds[i]);//把序列号和数据库中id对应
			
			msgSend.sendQueue.push(smsBean);//交给另外的线程去做吧
		}
		
	}
	
	public static void sendSms(String[] phones,String[] contents,String[] smsHistoryIds){
		if(!(phones.length==smsHistoryIds.length&&smsHistoryIds.length==contents.length))
			throw new RuntimeException("参数phones和contents和smsHistoryIds个数不一致");
		
		for(int i=0;i<phones.length;i++){
			SmsBean smsBean=new SmsBean();
			smsBean.setContent(contents[i]);
			smsBean.setPhones(new String[]{phones[i]});
			smsBean.setSmsHistoryId(smsHistoryIds[i]);
			smsBean.setSequence(nextSeq());
			
			seqHistoryId.put(smsBean.getSequence(), smsHistoryIds[i]);//把序列号和数据库中id对应
			
			msgSend.sendQueue.push(smsBean);//交给另外的线程去做吧
		}
	}
	
	/**
	 * 短信群发功能，这里的群发是真的群发，调用短信的群发接口<br/>
	 * 群发短信接口是不支持状态回执的
	 * @param phones 电话号码数组
	 * @param content 短信内容
	 * @param smsHistoryIds 短信发送历史ID数组，用户更新数据库使用 
	 */
	public static void sendGroupSms(String[] phones,String content,String[] smsHistoryIds){
		
	}
	
	public static void main(String[] args) {
		sendSms("13880249673", "短信测试", "10000");
		sendSms("13880249673", "短信测试", "10000");
		sendSms("13880249673", "短信测试", "10000");
		sendSms("13880249673", "短信测试", "10000");
		sendSms("13880249673", "短信测试", "10000");
		//TransactionManager
	
	}
	
}
